home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / glass / glass.lha / GLASS / glammar / ge11.c < prev    next >
C/C++ Source or Header  |  1991-01-21  |  5KB  |  266 lines

  1. /*
  2.  
  3.     This file is a part of the GLAMMAR source distribution 
  4.     and therefore subjected to the copy notice below. 
  5.     
  6.     Copyright (C) 1989,1990  Eric Voss, ericv@cs.kun.nl 
  7.  
  8.     This program is free software; you can redistribute it and/or modify
  9.     it under the terms of the GNU General Public License as published by
  10.     the Free Software Foundation version 1
  11.  
  12.     This program is distributed in the hope that it will be useful,
  13.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  14.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  15.     GNU General Public License for more details.
  16.  
  17.     You should have received a copy of the GNU General Public License
  18.     along with this program; if not, write to the Free Software
  19.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. */
  21. #include "ge1.h"
  22. #ifdef UEQUAL 
  23.  
  24. void uequal() {   /* equal */
  25. register AFFIX B = q ->a;
  26. register AFFIX A  = (q-1) ->a;
  27.    affix x, y;
  28.    char *csave = c;
  29.    register char *xs = c,*ys;
  30.    q -=2;
  31.    SAVE (x,A);
  32.    SAVE (y,B);
  33.    if ( A==B ) {
  34.       CONTINUE;
  35.    }
  36.    else { 
  37.       if ( ( x.r == nil) && (x.l == nil ) )
  38.            xs  = x.t;
  39.       else {
  40.          sprinta(A);
  41.          A -> t = xs; A -> l = nil; A -> r = nil;
  42.          *c++ = '\0';
  43.        }
  44.       ys = c;
  45.       if ( ( y.r == nil) && (y.l == nil ) )
  46.          ys  = y.t;
  47.       else { 
  48.          sprinta(B);
  49.          B -> t = ys;
  50.          B -> l = nil;
  51.          B -> r = nil;
  52.          *c++ = '\0';
  53.        }
  54.        if (afxcmp(xs,ys)==0) {
  55.          CONTINUE;
  56.        }
  57.    }
  58.    c = csave;
  59.    RESTORE(A,x);
  60.    RESTORE(B,y);
  61.    (q+1) -> a = A;
  62.    (q+2) -> a = B;
  63.    (q+3) -> q = uequal;
  64.    q +=3;
  65. }
  66. #endif
  67.  
  68. #ifdef UNOTEQUAL 
  69. void unotequal() {   /* notequal */
  70.  
  71. register AFFIX B = (q) ->a;
  72. register AFFIX A = (q-1) ->a;
  73.    affix x,y;
  74.    char *csave = c;
  75.    register char *xs = c,*ys;
  76.    q -=2;
  77.    SAVE (x,A);
  78.    SAVE (y,B);
  79.    if (A == B) 
  80.       goto done;
  81.    if ( ( x.r == nil) && (x.l == nil ) )
  82.       xs  = x.t;
  83.    else  {
  84.       sprinta(A);
  85.       A -> t = xs;
  86.       A -> l = nil;
  87.       A -> r = nil;
  88.       *c++ = '\0';
  89.    }
  90.    ys = c;
  91.    if ( ( y.r == nil) && (y.l == nil ) )
  92.      ys  = y.t;
  93.    else {
  94.       sprinta(B);
  95.       B -> t = ys;
  96.       B -> l = nil;
  97.       B -> r = nil;
  98.       *c++ = '\0';
  99.    }
  100.    if (afxcmp(xs,ys)==0) 
  101.          goto done;
  102. go:
  103.    CONTINUE;
  104. done:
  105.    RESTORE(A,x);
  106.    RESTORE(B,y);
  107.    (q+1) -> a = A;
  108.    (q+2) -> a = B;
  109.    (q+3) -> q = unotequal;
  110.    q +=3;
  111.    c = csave;
  112. }
  113. #endif
  114.  
  115. #ifdef UFQUAL 
  116. void ufqual () 
  117.    register cont *rq = q;
  118. register AFFIX A_1 = rq->a;
  119. register AFFIX A_0 = (rq -1)->a;
  120.    char *rc = c; 
  121.    if ( ddfqual (A_0, A_1)) {
  122.       q = rq -3;
  123.       (*(rq -2)->q)(); 
  124.       rq = q +2;
  125.    }
  126.    (rq -1)->a = A_0;
  127.    rq->a = A_1;
  128.    (rq + 1)->q = ufqual; 
  129.    q = rq + 1; 
  130.    c = rc;
  131.   if (rc > cstore_top ) cstore_overflow();
  132. }
  133. #endif
  134.  
  135. #ifdef UFOTEQUAL 
  136. void ufotequal () 
  137.    register cont *rq = q;
  138. register AFFIX A_1 = rq->a;
  139. register AFFIX A_0 = (rq -1)->a;
  140.    char *rc = c; 
  141.    if ( ! ddfqual (A_0, A_1)) {
  142.       q = rq -3;
  143.       (*(rq -2)->q)(); 
  144.       rq = q +2;
  145.    }
  146.    (rq -1)->a = A_0;
  147.    rq->a = A_1;
  148.    (rq + 1)->q = ufotequal; 
  149.    q = rq + 1; 
  150.    c = rc;
  151.   if (rc > cstore_top ) cstore_overflow();
  152. }
  153. #endif
  154.  
  155. #ifdef UCOMPARE 
  156. void ucompare () 
  157.    register cont *rq = q;
  158. register AFFIX A_3 = rq->a;
  159. register AFFIX A_2 = (rq -1)->a;
  160. register AFFIX A_1 = (rq -2)->a;
  161. register AFFIX A_0 = (rq -3)->a;
  162.    char *rc = c; 
  163.    if ( dcompare (A_0, A_1, A_2, A_3)) {
  164.       q = rq -5;
  165.       (*(rq -4)->q)(); 
  166.       rq = q +4;
  167.    }
  168.    (rq -3)->a = A_0;
  169.    (rq -2)->a = A_1;
  170.    (rq -1)->a = A_2;
  171.    rq->a = A_3;
  172.    (rq + 1)->q = ucompare; 
  173.    q = rq + 1; 
  174.    c = rc;
  175.   if (rc > cstore_top ) cstore_overflow();
  176. }
  177. #endif
  178.  
  179. #ifdef UCONTENTSOF 
  180. void ucontentsof () 
  181.    register cont *rq = q;
  182. register AFFIX A_3 = rq->a;
  183. register AFFIX A_2 = (rq -1)->a;
  184. register AFFIX A_1 = (rq -2)->a;
  185. register AFFIX A_0 = (rq -3)->a;
  186.    char *rc = c; 
  187.    if ( dcontentsof (A_0, A_1, A_2, A_3)) {
  188.       q = rq -5;
  189.       (*(rq -4)->q)(); 
  190.       rq = q +4;
  191.    }
  192.    (rq -3)->a = A_0;
  193.    (rq -2)->a = A_1;
  194.    (rq -1)->a = A_2;
  195.    rq->a = A_3;
  196.    (rq + 1)->q = ucontentsof; 
  197.    q = rq + 1; 
  198.    c = rc;
  199.   if (rc > cstore_top ) cstore_overflow();
  200. }
  201. #endif
  202.  
  203. #ifdef UCHARNUM 
  204. void ucharnum () 
  205.    register cont *rq = q;
  206. register AFFIX A_0 = rq->a;
  207.    char *rc = c; 
  208.    if ( dcharnum (A_0)) {
  209.       q = rq -2;
  210.       (*(rq -1)->q)(); 
  211.       rq = q +1;
  212.    }
  213.    rq->a = A_0;
  214.    (rq + 1)->q = ucharnum; 
  215.    q = rq + 1; 
  216.    c = rc;
  217.   if (rc > cstore_top ) cstore_overflow();
  218. }
  219. #endif
  220.  
  221. #ifdef USETTABSTOP 
  222. void usettabstop () 
  223.    register cont *rq = q;
  224. register AFFIX A_0 = rq->a;
  225.    char *rc = c; 
  226.    int tabstop_save = tabstop;
  227.    if ( dsettabstop (A_0)) {
  228.       q = rq -2;
  229.       (*(rq -1)->q)(); 
  230.       rq = q +1;
  231.    }
  232.    rq->a = A_0;
  233.    (rq + 1)->q = usettabstop; 
  234.    q = rq + 1; 
  235.    c = rc;
  236.    tabstop= tabstop_save ;
  237.   if (rc > cstore_top ) cstore_overflow();
  238. }
  239. #endif
  240.  
  241. #ifdef USOMENAME 
  242. void usomename () 
  243.    register cont *rq = q;
  244. register AFFIX A_0 = rq->a;
  245.    char *rc = c; 
  246.    if ( dsomename (A_0)) {
  247.       q = rq -2;
  248.       (*(rq -1)->q)(); 
  249.       rq = q +1;
  250.    }
  251.    rq->a = A_0;
  252.    (rq + 1)->q = usomename; 
  253.    q = rq + 1; 
  254.    c = rc;
  255.   if (rc > cstore_top ) cstore_overflow();
  256. }
  257. #endif
  258.  
  259.